package com.yeti.repository;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.yeti.domain.Cliente;
import com.yeti.domain.Lista;

@Repository(value = "clienteDao")
public class ClienteDAOImpl implements ClienteDAO {

	private static final long serialVersionUID = -2113618745189446381L;
	private EntityManager em = null;

    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this.em = em;
    }
    
	/**
	 * Metodo que actualiza la informacion de un cliente de la base de datos.
	 * 
	 * @param c: Es el cliente a actualizar.
	 * @return devuelve true si la operacion se produce correctamente o false en caso contrario.
	 */
	@Override
	public boolean updateCliente(Cliente c) {
    	try{
    		em.merge(c);
    	}catch(Exception e){
    		System.out.println(e);
    		return false;
    	}
    	return true;
	}

	/**
	 * Metodo que agrega un cliente en la base de datos.
	 * 
	 * @param c: Es el cliente a agregar.
	 * @return devuelve true si la operacion se produce correctamente o false en caso contrario.
	 */
	@Override
	public boolean addCliente(Cliente c) {
		try{
			em.persist(c);
			return true;
		}catch(Exception e){
			System.out.println(e);
			return false;
		}
	}

	/**
	 * Metodo que elimina a un cliente de la base de datos.
	 * 
	 * @param c: Es el cliente a eliminar.
	 * @return devuelve true si la operacion se produce correctamente o false en caso contrario.
	 */
	@Override
	public boolean remCliente(Cliente c) {
		try{
			em.remove(c);
		}catch(Exception e){
			System.out.println(e);
			return false;
		}
		return true;
	}
	
	/**
	 * Metodo que busca a un cliente por su id en la base de datos.
	 * 
	 * @param id: Es el id de usuario por el que se buscara al cliente.
	 * @return devuelve al cliente si lo encuentra o null en caso contrario.
	 */
	@Override
	public Cliente getCliente(int id) {
		try{
			return (Cliente)em.find(Cliente.class, id);
		}catch(Exception e){
			System.out.println(e);
			return null;
		}
	}

	/**
	 * Metodo que busca a un cliente por su nombre de usuario en la base de datos.
	 * 
	 * @param username: Es el nombre de usuario por el que se buscara al cliente.
	 * @return devuelve al cliente si lo encuentra o null en caso contrario.
	 */
	@Override
	public Cliente getCliente(String username) {
		try{
			Query query=em.createQuery("select u from User u where u.username=:username");
			query.setParameter("username", username);
			return (Cliente)query.getResultList().get(0);
		}catch(Exception e){
			System.out.println(e);
			return null;
		}
	}

	/**
	 * Metodo que obtiene todos los clientes del sistema.
	 * 
	 * @return devuelve los clientes si la operacion se produce correctamente o null en caso contrario.
	 */
	@Override
	public ArrayList<Cliente> getClientes() {
		try{
			return (ArrayList<Cliente>)em.createQuery("select c from Cliente c").getResultList();
		}catch(Exception e){
			System.out.println(e);
			return null;
		}
	}

}
